home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / sys / mem_grab.c < prev    next >
C/C++ Source or Header  |  1990-12-19  |  2KB  |  64 lines

  1.  
  2. /*
  3.  * @(#)mem_grab.c 1.1 86/09/27
  4.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  5.  */
  6.  
  7. /*
  8.  * Memory raster get routine.  Same arguments and restrictions as batchrop, but
  9.  * it copies OUT what batchrop would copy IN.  Count argument ignored.
  10.  *
  11.  * Note the use of this non-portable features:
  12.  *    -- loopd6, which loops over the provided 2nd argument expression
  13.  *       until register d6 goes from 0 to -1.  Equivalent to:
  14.  *        loopd6(a,b;) --> while((short)d6var-- != 0) b;
  15.  * This is to generate better code.  It should be fixed by
  16.  * fixing the C compiler to generate the better code in the portable case.
  17.  */
  18.  
  19. #include "../h/types.h"
  20. #include "../h/pixrect.h"
  21. #include "../sun3/memreg.h"
  22. #include "../h/memvar.h"
  23. #include "../h/pr_util.h"
  24.  
  25. /* Read char from random pixrect into a little pixrect. */
  26. /* Inverse of batchrop. */
  27. /* For the moment, dst and src are reversed in names here. */
  28. prom_mem_grab(dst, op, src, count)
  29.     struct pr_prpos dst;
  30.     int op;
  31.     struct pr_prpos *src;
  32.     short count;
  33. {
  34.     register u_short *sp;
  35.     register char *dp;
  36.     register char *handy;
  37.     register sizex, sizey;    /* sizey must be d6 */
  38.     register vert, dskew;
  39.  
  40. #ifdef lint
  41.     count = count;  op = op;
  42. #endif
  43. #define dprd ((struct mpr_data *)handy)
  44.     dprd = mpr_d(dst.pr);
  45.     vert = dprd->md_linebytes;
  46.     dp = (char *)mprd_addr(dprd, dst.pos.x, dst.pos.y);
  47.     dskew = mprd_skew(dprd, dst.pos.x, dst.pos.y);
  48. #undef dprd
  49. #define spr ((struct pixrect *)handy)
  50.     spr = src->pr;
  51.     sizex = spr->pr_size.x;
  52.     sizey = spr->pr_size.y;
  53. #define sprd ((struct mpr_data *)handy)
  54.     sprd = mpr_d(spr);
  55.     sp = (u_short *)sprd->md_image;
  56.  
  57.         if (dskew + sizex <= 16) {
  58.             loopd6(srca, *sp++ = *(u_short *)dp << dskew; dp += vert;)
  59.         } else {
  60.             dskew = 16 - dskew;
  61.             loopd6(srcb, *sp++ = *(u_int *)dp >> dskew; dp += vert;)
  62.         }
  63. }
  64.